package com.igrowing.easyRpc;

import com.igrowing.easyRpc.config.RegistryConfig;
import com.igrowing.easyRpc.config.RpcConfig;
import com.igrowing.easyRpc.constant.RpcConstant;
import com.igrowing.easyRpc.registry.Registry;
import com.igrowing.easyRpc.registry.RegistryFactory;
import com.igrowing.easyRpc.utils.ConfigUtils;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class RpcApplication {

    private static volatile RpcConfig rpcConfig;

    /**
     * 初始化，传入自定义配置
     * @param newRpcConfig
     */
//    public static void init(RpcConfig newRpcConfig)
//    {
//        rpcConfig=newRpcConfig;
//        log.info("rpc init,config = {}",newRpcConfig.toString());
//    }

    /**
     * 框架初始化，支持传入自定义配置
     *
     * @param newRpcConfig
     */
    public static void init(RpcConfig newRpcConfig) {
        rpcConfig = newRpcConfig;
        log.info("rpc init, config = {}", newRpcConfig.toString());
        // 注册中心初始化
        RegistryConfig registryConfig = rpcConfig.getRegistryConfig();
        Registry registry = RegistryFactory.getInstance(registryConfig.getRegistry());
        registry.init(registryConfig);
        log.info("registry init, config = {}", registryConfig);
        /**
         * 当 JVM 开始关闭时，它会启动所有注册的关闭钩子线程，并等待它们完成。在这个例子中，当 JVM 关闭时，
         * 将会启动一个新的线程来执行 registry 对象的 destroy 方法。
         * 这个方法通常用于释放资源、保存状态、关闭连接等清理工作
         */
        Runtime.getRuntime().addShutdownHook(new Thread(registry::destroy));
    }

    /**
     * 读取配置文件初始化
     */
    public static void init()
    {
        RpcConfig newRpcConfig;
        try {
            newRpcConfig  = ConfigUtils.loadConfig(RpcConfig.class, RpcConstant.DEFAULT_CONFIG_PREFIX);
        } catch (Exception e) {
            // 读取配置失败，使用默认值
            newRpcConfig = new RpcConfig();
        }
        init(newRpcConfig);
    }






    /**
     * 获取单例配置
     * @return
     */
    public static RpcConfig getRpcConfig()
    {
        if (rpcConfig==null)
        {
            synchronized (RpcConfig.class)
            {
                if (rpcConfig==null)
                init();
            }
        }
        return rpcConfig;
    }

}
